diff --git a/ixgbe/Makefile b/ixgbe/Makefile
index c49cba8..546435f 100644
--- a/ixgbe/Makefile
+++ b/ixgbe/Makefile
@@ -28,9 +28,9 @@ ifneq ($(KERNELRELEASE),)
 # Makefile for the Intel(R) 10GbE PCI Express Linux Network Driver
 #
 
-obj-$(CONFIG_IXGBE) += ixgbe.o
+obj-$(CONFIG_IXGBE) += ixgbe$(NETMAP_DRIVER_SUFFIX).o
 
-define ixgbe-y
+define ixgbe$(NETMAP_DRIVER_SUFFIX)-y
 	ixgbe_main.o
 	ixgbe_api.o
 	ixgbe_common.o
@@ -49,24 +49,24 @@ define ixgbe-y
 	ixgbe_x540.o
 	ixgbe_x550.o
 endef
-ixgbe-y := $(strip ${ixgbe-y})
+ixgbe$(NETMAP_DRIVER_SUFFIX)-y := $(strip ${ixgbe$(NETMAP_DRIVER_SUFFIX)-y})
 
-ixgbe-${CONFIG_DCB} += ixgbe_dcb_nl.o
+ixgbe$(NETMAP_DRIVER_SUFFIX)-${CONFIG_DCB} += ixgbe_dcb_nl.o
 
-ixgbe-${CONFIG_DEBUG_FS} += ixgbe_debugfs.o
+ixgbe$(NETMAP_DRIVER_SUFFIX)-${CONFIG_DEBUG_FS} += ixgbe_debugfs.o
 
-ixgbe-${CONFIG_FCOE:m=y} += ixgbe_fcoe.o
+ixgbe$(NETMAP_DRIVER_SUFFIX)-${CONFIG_FCOE:m=y} += ixgbe_fcoe.o
 
-ixgbe-$(CONFIG_PTP_1588_CLOCK:m=y) += ixgbe_ptp.o
+ixgbe$(NETMAP_DRIVER_SUFFIX)-$(CONFIG_PTP_1588_CLOCK:m=y) += ixgbe_ptp.o
 
-ixgbe-${CONFIG_SYSFS} += ixgbe_sysfs.o
+ixgbe$(NETMAP_DRIVER_SUFFIX)-${CONFIG_SYSFS} += ixgbe_sysfs.o
 
-ixgbe-y += kcompat.o
+ixgbe$(NETMAP_DRIVER_SUFFIX)-y += kcompat.o
 
 else	# ifneq($(KERNELRELEASE),)
 # normal makefile
 
-DRIVER := ixgbe
+DRIVER := ixgbe$(NETMAP_DRIVER_SUFFIX)
 
 ifeq (,$(wildcard common.mk))
   $(error Cannot find common.mk build rules)
@@ -127,9 +127,12 @@ ccc: clean
 	@+$(call devkernelbuild,modules,coccicheck MODE=report))
 
 # Build manfiles
-manfile:
+manfile: ../$(DRIVER).$(MANSECTION)
 	@gzip -c ../${DRIVER}.${MANSECTION} > ${DRIVER}.${MANSECTION}.gz
 
+../$(DRIVER).$(MANSECTION):
+	touch $@
+
 # Clean the module subdirectories
 clean:
 	@+$(call devkernelbuild,clean)
diff --git a/ixgbe/ixgbe_main.c b/ixgbe/ixgbe_main.c
index 06017ea..4974b37 100644
--- a/ixgbe/ixgbe_main.c
+++ b/ixgbe/ixgbe_main.c
@@ -747,6 +747,23 @@ struct ixgbe_adapter *adapter = netdev_priv(netdev);
 	}
 }
 
+#if defined(CONFIG_NETMAP) || defined(CONFIG_NETMAP_MODULE)
+/*
+ * The #ifdef DEV_NETMAP / #endif blocks in this file are meant to
+ * be a reference on how to implement netmap support in a driver.
+ * Additional comments are in ixgbe_netmap_linux.h .
+ *
+ * The code is originally developed on FreeBSD and in the interest
+ * of maintainability we try to limit differences between the two systems.
+ *
+ * <ixgbe_netmap_linux.h> contains functions for netmap support
+ * that extend the standard driver.
+ * It also defines DEV_NETMAP so further conditional sections use
+ * that instead of CONFIG_NETMAP
+ */
+#include <ixgbe_netmap_linux.h>
+#endif
+
 /**
  * ixgbe_clean_tx_irq - Reclaim resources after transmit completes
  * @q_vector: structure containing interrupt and ring information
@@ -765,6 +782,17 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
 	if (test_bit(__IXGBE_DOWN, &adapter->state))
 		return true;
 
+#ifdef DEV_NETMAP
+	/*
+	 * In netmap mode, all the work is done in the context
+	 * of the client thread. Interrupt handlers only wake up
+	 * clients, which may be sleeping on individual rings
+	 * or on a global resource for all rings.
+	 */
+	if (netmap_tx_irq(adapter->netdev, tx_ring->queue_index) != NM_IRQ_PASS)
+		return true;
+#endif /* DEV_NETMAP */
+
 	tx_buffer = &tx_ring->tx_buffer_info[i];
 	tx_desc = IXGBE_TX_DESC(tx_ring, i);
 	i -= tx_ring->count;
@@ -1804,6 +1832,16 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
 #endif /* CONFIG_FCOE */
 	u16 cleaned_count = ixgbe_desc_unused(rx_ring);
 
+#ifdef DEV_NETMAP
+	/*
+	 * 	 Same as the txeof routine: only wakeup clients on intr.
+	 */
+	int dummy, nm_irq;
+	nm_irq = netmap_rx_irq(rx_ring->netdev, rx_ring->queue_index, &dummy);
+	if (nm_irq != NM_IRQ_PASS)
+		return (nm_irq == NM_IRQ_RESCHED) ? budget : 1;
+#endif /* DEV_NETMAP */
+
 	do {
 		union ixgbe_adv_rx_desc *rx_desc;
 		struct sk_buff *skb;
@@ -2912,6 +2950,10 @@ void ixgbe_configure_tx_ring(struct ixgbe_adapter *adapter,
 
 	clear_bit(__IXGBE_HANG_CHECK_ARMED, &ring->state);
 
+#ifdef DEV_NETMAP
+	txdctl = ixgbe_netmap_configure_tx_ring(adapter, reg_idx, txdctl);
+#endif /* DEV_NETMAP */
+
 	/* enable queue */
 	IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(reg_idx), txdctl);
 
@@ -3476,6 +3518,10 @@ void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter,
 	IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(reg_idx), rxdctl);
 
 	ixgbe_rx_desc_queue_enable(adapter, ring);
+#ifdef DEV_NETMAP
+	if (ixgbe_netmap_configure_rx_ring(adapter, reg_idx))
+		return;
+#endif /* DEV_NETMAP */
 	ixgbe_alloc_rx_buffers(ring, ixgbe_desc_unused(ring));
 }
 
@@ -10436,6 +10482,10 @@ no_info_string:
 		hw->mac.ops.setup_eee(hw, eee_enable);
 	}
 
+#ifdef DEV_NETMAP
+	ixgbe_netmap_attach(adapter);
+#endif /* DEV_NETMAP */
+
 	return 0;
 
 err_register:
@@ -10481,6 +10531,11 @@ static void __devexit ixgbe_remove(struct pci_dev *pdev)
 		return;
 
 	netdev = adapter->netdev;
+
+#ifdef DEV_NETMAP
+	ixgbe_netmap_detach(adapter);
+#endif /* DEV_NETMAP */
+
 #ifdef HAVE_IXGBE_DEBUG_FS
 	ixgbe_dbg_adapter_exit(adapter);
 
diff --git a/ixgbe/kcompat.h b/ixgbe/kcompat.h
index df445c5..f8bec83 100644
--- a/ixgbe/kcompat.h
+++ b/ixgbe/kcompat.h
@@ -25,6 +25,8 @@
 #ifndef _KCOMPAT_H_
 #define _KCOMPAT_H_
 
+#include <netmap_linux_config.h>
+
 #ifndef LINUX_VERSION_CODE
 #include <linux/version.h>
 #else
@@ -5172,7 +5174,7 @@ static inline void csum_replace_by_diff(__sum16 *sum, __wsum diff)
 #if !(RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,2)))
 static inline void page_ref_inc(struct page *page)
 {
-	atomic_inc(&page->_count);
+	atomic_inc(&page->NETMAP_LINUX_PAGE_COUNT);
 }
 
 #endif
